package cn.iocoder.yudao.module.reading.dal.mysql.bookset;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.reading.controller.app.bookset.vo.BookSetPageReqVO;
import cn.iocoder.yudao.module.reading.dal.dataobject.bookset.BookSetDO;
import cn.iocoder.yudao.module.reading.framework.util.ReadingUtils;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 绘本集 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface BookSetMapper extends BaseMapperX<BookSetDO> {

    /**
     * 分页查询绘本集
     *
     * @param reqVO 查询条件
     * @return 分页结果
     */
    default PageResult<BookSetDO> selectPage(BookSetPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<BookSetDO>()
                .eqIfPresent(BookSetDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(BookSetDO::getLanguage, reqVO.getLang())
                .likeIfPresent(BookSetDO::getTitle, reqVO.getKeyword())
                .eq(BookSetDO::getIsActive, true)
                .orderByDesc(BookSetDO::getIsRecommended)
                .orderByAsc(BookSetDO::getId));
    }

    /**
     * 分页查询绘本集（排除用户隐藏的项目）
     *
     * @param reqVO  查询条件
     * @param userId 用户ID
     * @return 分页结果
     */
    PageResult<BookSetDO> selectPageExcludeUserHidden(BookSetPageReqVO reqVO, Long userId);

    /**
     * 根据语言查询推荐绘本集
     *
     * @param language 语言类型
     * @param limit    限制数量
     * @return 绘本集列表
     */
    default List<BookSetDO> selectRecommendedByLanguage(String language, Integer limit) {
        return selectList(new LambdaQueryWrapperX<BookSetDO>()
                .eq(BookSetDO::getLanguage, language)
                .eq(BookSetDO::getIsRecommended, true)
                .eq(BookSetDO::getIsActive, true)
                .orderByAsc(BookSetDO::getId)
                .last("LIMIT " + limit));
    }

    /**
     * 根据语言查询推荐绘本集（排除用户隐藏的项目）
     *
     * @param language 语言类型
     * @param limit    限制数量
     * @param userId   用户ID
     * @return 绘本集列表
     */
    List<BookSetDO> selectRecommendedByLanguageExcludeUserHidden(String language, Integer limit, Long userId);

    /**
     * 根据语言和分类查询推荐绘本集
     *
     * @param language   语言类型
     * @param categoryId 分类ID
     * @param limit      限制数量
     * @return 绘本集列表
     */
    default List<BookSetDO> selectRecommendedByLanguageAndCategory(String language, Long categoryId, Integer limit) {
        return selectList(new LambdaQueryWrapperX<BookSetDO>()
                .eqIfPresent(BookSetDO::getLanguage, language)
                .eqIfPresent(BookSetDO::getCategoryId, categoryId)
                .eq(BookSetDO::getIsRecommended, true)
                .eq(BookSetDO::getIsActive, true)
                .orderByAsc(BookSetDO::getId)
                .last("LIMIT " + limit));
    }

    /**
     * 根据分类查询绘本集
     *
     * @param categoryId 分类ID
     * @param limit      限制数量
     * @return 绘本集列表
     */
    default List<BookSetDO> selectByCategoryId(Long categoryId, Integer limit) {
        return selectList(new LambdaQueryWrapperX<BookSetDO>()
                .eq(BookSetDO::getCategoryId, categoryId)
                .eq(BookSetDO::getIsActive, true)
                .orderByDesc(BookSetDO::getIsRecommended)
                .orderByAsc(BookSetDO::getId)
                .last(limit != null ? "LIMIT " + limit : ""));
    }

    /**
     * 搜索绘本集
     *
     * @param keyword  关键词
     * @param language 语言类型
     * @return 绘本集列表
     */
    default List<BookSetDO> searchBookSets(String keyword, String language) {
        LambdaQueryWrapperX<BookSetDO> wrapper = new LambdaQueryWrapperX<BookSetDO>();

        // 如果有关键词，则搜索标题或来源
        if (keyword != null && !keyword.trim().isEmpty()) {
            wrapper.nested(w -> w
                    .like(BookSetDO::getTitle, keyword)
                    .or()
                    .like(BookSetDO::getSource, keyword)
            );
        }

        return selectList(wrapper
                .eqIfPresent(BookSetDO::getLanguage, language)
                .eq(BookSetDO::getIsActive, true)
                .orderByDesc(BookSetDO::getIsRecommended)
                .orderByAsc(BookSetDO::getId));
    }

    /**
     * 分页搜索绘本集
     *
     * @param keyword  关键词
     * @param language 语言类型
     * @param pageParam 分页参数
     * @return 绘本集分页结果
     */
    default PageResult<BookSetDO> searchBookSetsPage(String keyword, String language, PageParam pageParam) {
        LambdaQueryWrapperX<BookSetDO> wrapper = new LambdaQueryWrapperX<BookSetDO>();

        // 如果有关键词，则搜索标题或来源
        if (keyword != null && !keyword.trim().isEmpty()) {
            wrapper.nested(w -> w
                    .like(BookSetDO::getTitle, keyword)
                    .or()
                    .like(BookSetDO::getSource, keyword)
            );
        }

        return selectPage(pageParam, wrapper
                .eqIfPresent(BookSetDO::getLanguage, language)
                .eq(BookSetDO::getIsActive, true)
                .orderByDesc(BookSetDO::getIsRecommended)
                .orderByAsc(BookSetDO::getId));
    }



    /**
     * 管理员分页查询绘本集
     *
     * @param reqVO 查询条件
     * @return 分页结果
     */
    default PageResult<BookSetDO> selectPage(cn.iocoder.yudao.module.reading.controller.admin.bookset.vo.BookSetPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<BookSetDO>()
                .likeIfPresent(BookSetDO::getTitle, reqVO.getTitle())
                .eqIfPresent(BookSetDO::getCategoryId, reqVO.getCategoryId())
                .eqIfPresent(BookSetDO::getLanguage, reqVO.getLanguage())
                .eqIfPresent(BookSetDO::getDifficultyLevel, reqVO.getDifficultyLevel())
                .eqIfPresent(BookSetDO::getIsRecommended, reqVO.getIsRecommended())
                .eqIfPresent(BookSetDO::getIsActive, reqVO.getIsActive())
                .orderByDesc(BookSetDO::getId));
    }

    /**
     * 查询最大ID
     *
     * @return 最大ID
     */
    default Long selectMaxId() {
        BookSetDO maxRecord = selectOne(new LambdaQueryWrapperX<BookSetDO>()
                .orderByDesc(BookSetDO::getId)
                .last("LIMIT 1"));
        return maxRecord != null ? maxRecord.getId() : null;
    }

    /**
     * 查询绘本集列表
     *
     * @param language 语言类型
     * @param title    标题
     * @return 绘本集列表
     */
    default List<BookSetDO> selectList(String language, String title) {
        return selectList(new LambdaQueryWrapperX<BookSetDO>()
                .eqIfPresent(BookSetDO::getLanguage, language)
                .likeIfPresent(BookSetDO::getTitle, title)
                .eq(BookSetDO::getIsActive, true)
                .orderByDesc(BookSetDO::getIsRecommended)
                .orderByAsc(BookSetDO::getId));
    }

    /**
     * 批量更新绘本集状态
     *
     * @param ids      绘本集ID列表
     * @param isActive 是否启用
     */
    default void updateBatchStatus(List<Long> ids, Boolean isActive) {
        update(new BookSetDO().setIsActive(isActive),
               new LambdaQueryWrapperX<BookSetDO>().in(BookSetDO::getId, ids));
    }

}
